﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Open_MUD.Kernel;

namespace Open_MUD.Mudlib.lib
{
    class Contenedor:Rompible
    {
		private const int INFINITO = -1;
		
		protected ArrayList contenido=new ArrayList();
		private int pesoContenidoActual=0;
		private int pesoContenidoMax=INFINITO;
		private int volumenContenidoActual=0;
		private int volumenContenidoMax=INFINITO;
		private int numItemsContenidoActual=0;
		private int numItemsContenidoMax=INFINITO;
		
		public bool Añadir(Posicionable que)
		{
			if ( pesoContenidoMax != INFINITO && pesoContenidoActual + que.Peso > pesoContenidoMax )
				throw new MudException(que.Short + " pesa demasiado.");
				
			if ( volumenContenidoMax != INFINITO && volumenContenidoActual + que.Volumen > volumenContenidoMax )
				throw new MudException(que.Short + " es demasiado grande.");
				
			if ( numItemsContenidoMax != INFINITO && numItemsContenidoActual + 1 > numItemsContenidoMax )
				throw new MudException( this.Short + " tiene demasiados items.");
			
			if ( ! que.Entorno.Equals(this) )
				throw new MudException( "No se puede meter "+que.Short+" en "+ this.Short);
			
			if ( ! contenido.Contains(que) )
			{
				contenido.Add(que);
				pesoContenidoActual += que.Peso;
				volumenContenidoActual += que.Volumen;
				numItemsContenidoActual++;
			}
			return true;
		}
		
		public bool Contiene(MUDObject que)
		{
		   return contenido.Contains(que);
		}
		
		public MUDObject buscar(String que)
		{
		   for(int i = 0 ;  i < contenido.Count ; i++ )
		   {
		      if ( ((MUDObject)contenido[i]).Match(que) )
		         return (MUDObject) contenido[i];
		   }
		   return null;
		}
		
		public bool Sacar(Posicionable que)
		{
			if( contenido.Contains(que) )
			{
				contenido.Remove(que);                
				pesoContenidoActual -= que.Peso;
				volumenContenidoActual -= que.Volumen;
				numItemsContenidoActual--;
			}
			return true;
		}
		
		protected void PesoInfinito(){
			pesoContenidoMax = INFINITO;
		}
		protected void VolumenInfinito(){
			volumenContenidoMax = INFINITO;
		}
		protected void ItemsInfinito(){
			numItemsContenidoMax = INFINITO;
		}
		
		protected string numAStr(string num)
		{
            return "Un";
        }

		protected string contenidoAString()
		{
		   Dictionary<string,int> terminos = new Dictionary<string,int>();
		   for(int i = 0; i < contenido.Count ; i++ )
		   {
		      string key = ((MUDObject)contenido[i]).Short;
		      if ( terminos.ContainsKey(key) )
		         terminos[key] = terminos[key] + 1;
		      else
		         terminos[key] = 1;
		   }
		   for(int i=0;i<terminos.Count;i++)
		   {
		      
		   }
           return "contenido";
		}		
		
        protected string numeroAString(int num)
        {
            return numeroAString(num, true);
        }

		protected string numeroAString(int num, bool masculino)
		{
		   switch(num){
		      case 0: return "cero";break;
		      case 1: if( masculino)
		                return "un";
		              else
		                return "una";
		        break;
		      case 2: return "dos";break;
		      case 3: return "tres";break;
		      case 4: return "cuatro";break;
		      case 5: return "cinco";break;
		      case 6: return "seis";break;
		      case 7: return "siete";break;
		      case 8: return "ocho";break;
		      case 9: return "nueve";break;
		      case 10: return "diez";break;		      
		      case 11: return "once";break;
		      case 12: return "doce";break;
		      case 13: return "trece";break;
		      case 14: return "catorce";break;
		      case 15: return "quince";break;
		      case 16: return "dieciseis";break;
		      case 17: return "diecisiete";break;
		      case 18: return "dieciocho";break;
		      case 19: return "diecinueve";break;
		      case 20: return "veinte";break;		      
		   }
		   return "muchos";
		}

        protected string listaAString(ArrayList lista)
        {
            string ret="";
            if (lista.Count == 1)
            {
                return ((MUDObject)lista[0]).Short;
            }
            else
            {
                for (int i = 0; i < lista.Count - 3; i++)
                {
                    ret += ((MUDObject)lista[i]).Short + ", ";
                }
                ret += ((MUDObject)lista[lista.Count - 2]).Short + " y " + ((MUDObject)lista[lista.Count - 1]).Short;
            }
            return ret;

        }

        protected string listaAStringNumerado(ArrayList lista)
		{
           string[] res = null;
		   Dictionary<int,int> dict = new Dictionary<int,int>();
           Dictionary<string, int> procesed = new Dictionary<string, int>();
		   
		   for(int i= 0; i < lista.Count ; i++ )
		   {
		      MUDObject obj = (MUDObject) lista[i];
              if (procesed.ContainsKey(obj.Short))
                  dict[((int)procesed[obj.Short])]++;
              else
              {
                  procesed.Add(obj.Short, i);
                  dict[i] = 1;
              }
		   }
		   res = new String[dict.Count];
           string[] keys = new string[procesed.Keys.Count];
           procesed.Keys.CopyTo(keys, 0);
		   for( int i = 0 ; i< dict.Count ; i++)
		   {
		      string aux = ((MUDObject)lista[procesed[keys[i]]]).Short;
		      if ( dict[procesed[keys[i]]] > 1 )
		         aux = ((MUDObject)lista[procesed[keys[i]]]).ShortPlural;
		      res[i] = numeroAString(dict[procesed[keys[i]]])+" "+aux; 
		   }		   		   
		   if ( res != null )
		   {
		      string result=res[0];
		      for(int i = 1 ; i < res.Length -2 ; i++)
		      {
		         result += ", " + res[i];
		      }
		      if ( res.Length > 1 )
		         result+=" y "+res[res.Length-1];
		      return result;
		   }
		   return "";
		}

        public void clonar(string file)
        {

        }
    }
}
